home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- MODULE: _rgetf.h
- PURPOSE: recio character delimited floating point input functions
- COPYRIGHT: (C) 1994 William Pierpoint
- VERSION: 2.00
- RELEASE: April 15, 1994
- *****************************************************************************/
-
- #ifndef _RGETF_H
- #define _RGETF_H
-
- #include "recio.h"
-
- extern int _rstatus(REC *rp, int mode);
- extern char *_rfldstr(REC *rp, size_t len);
- extern char *_rerrs(REC *rp, int errnum);
-
- /* clip value v between lower l and upper u bounds */
- #define range(l, v, u) (min(max((l),(v)),(u)))
-
- /* macro to get character delimited floating point number */
- #define rget_fn( /* define function to get number from record */\
- fn_type, /* defined function return type */\
- fn_name, /* defined function name */\
- fn_err, /* defined function error return value */\
- cv_type, /* conversion function return type */\
- cv_name, /* conversion function name */\
- fn_negmin, /* inclusive valid negative minimum value */\
- fn_negmax, /* inclusive valid negative maximum value */\
- fn_posmin, /* inclusive valid positive minimum value */\
- fn_posmax) /* inclusive valid positive maximum value */\
- \
- fn_type fn_name( /* return fn_type, return fn_err on error */\
- REC *rp) /* record pointer */\
- { \
- fn_type result=(fn_err); /* result to return */\
- cv_type val; /* conversion value */\
- char *fldptr; /* pointer to field string */\
- char *endptr; /* pointer to first invalid field char */\
- \
- if (!_rstatus(rp, R_READ)) { \
- fldptr = _rfldstr(rp, 0); \
- if (fldptr) { \
- for (;;) { \
- if (*fldptr != '\0') { \
- endptr = fldptr; \
- val = cv_name(fldptr, &endptr); \
- while (isspace(*endptr)) endptr++; \
- if (errno==ERANGE || !*endptr) { \
- if (!errno) { \
- if (!val || (val>=(fn_negmin) && val<=(fn_negmax)) || \
- (val>=(fn_posmin) && val<=(fn_posmax))) { \
- result = (fn_type) val; \
- goto done; \
- } \
- } /* out of range */ \
- fldptr = _rerrs(rp, R_ERANGE); \
- if (fldptr) { continue; } else { goto done; } \
- } /* invalid data */ \
- fldptr = _rerrs(rp, R_EINVDAT); \
- if (fldptr) { continue; } else { goto done; } \
- } /* missing data (empty fldstr) */ \
- fldptr = _rerrs(rp, R_EMISDAT); \
- if (fldptr) { continue; } else { goto done; } \
- } \
- } /* null pointer */ \
- } \
- done: \
- return result; \
- }
-
- #endif
-